<?php
/*
 *      event.class.php
 *
 *      Copyright 2010 Patrice Ferlet <metal3d@gmail.com>
 *
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */

// $Id: event.class.php 19 2010-12-14 22:46:23Z Metal3d $
// $HeadURL: http://valaya.googlecode.com/svn/trunk/utils/event.class.php $

/**
 *  Event are fired by controllers, they are catched by listeners
 * */
class Event {

	private $name;
	private $content;
	static $listeners;

	/**
	 * Create Event object
	 *
	 * @param string $name
	 * @param mixed &$content
	 * */
	public function __construct($name,&$content){
		$this->content = &$content;
		$this->name = $name;
		if (!is_array(self::$listeners)) {
			self::$listeners = glob(_config('modulepath','project').'/*/*.listener.php');
			if (!self::$listeners) self::$listeners = array();
		}
	}

	/**
	 * Fire event, each listeners will process actions
	 *
	 * @return array $listeners_answers
	 * */
	public function fire(){
		//run event on every listeners
		$answers = array();
		foreach(self::$listeners as $listener) {
			require_once($listener);
			$name = basename($listener);
			$name = explode('.',$name);
			$name = ucfirst($name[0]).'Listener';
			$listener = new $name();
			$a = $listener->onEvent($this->name,$this->content);
			if(!is_null($a)) $answers[$name] = $a;
		}
		return $answers;
	}

}
